/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package snu.fronteiras.controladores.missa;

import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.text.Font;
import snu.controladores.MissaJpaController;
import snu.controladores.SNU;
import snu.entidades.missa.Missa;
import snu.entidades.musica.Musica;
import snu.entidades.musica.TipoMusica;
import snu.fronteiras.controladores.FXMLDocumentController;
import snu.fronteiras.controladores.HomeController;
import snu.util.BotoesImagemUtil;
import snu.util.DataUtil;
import snu.util.Dialogs;
import snu.util.EfeitosUtil;

/**
 * Classe controladora do FXML
 *
 * @author Washington Luis
 */
public class MontarMissaFinalizacaoController implements Initializable {

    @FXML
    private AnchorPane contentMontarMissaFinalizacao;
    @FXML
    private Label lblMontarMissaFinalizacao;
    @FXML
    private Label lblInformacaoPasso;
    @FXML
    private Font x1;
    @FXML
    private Button btnOk;
    @FXML
    private Label lblInformacaoFuncionamento;
    @FXML
    private TextArea areaDescricaoEmail;
    @FXML
    private ImageView imgInicio;
    @FXML
    private ImageView iconeOk;
    @FXML
    private ImageView imgVoltar;

    private Missa missa;

    private MontarMissaOrganizacaoController controladorOrigem;

    private PesquisarMissaController controladorPesquisa;

    public void initData(Missa missa, Map<TipoMusica, Object> mapaMusicasMissa,
            MontarMissaOrganizacaoController controladorOrigem, PesquisarMissaController controladorPesquisa) {
        this.missa = missa;
        this.controladorOrigem = controladorOrigem;
        this.controladorPesquisa = controladorPesquisa;

        StringBuilder musicasEmail = new StringBuilder();
        String textoEmail = SNU.configuracoesSistema.getTemplateDescricaoEmail();

        List<Map.Entry<TipoMusica, Object>> conjuntoMusicasMissa
                = new ArrayList<>(mapaMusicasMissa.entrySet());

        Collections.sort(conjuntoMusicasMissa, new Comparator<Map.Entry<TipoMusica, Object>>() {
            @Override
            public int compare(Map.Entry<TipoMusica, Object> entradaMusicaMissa1, Map.Entry<TipoMusica, Object> entradaMusicaMissa2) {
                return entradaMusicaMissa1.getKey().compareTo(entradaMusicaMissa2.getKey());
            }
        });

        for (Map.Entry<TipoMusica, Object> entradaMusicasMissa : conjuntoMusicasMissa) {
            if (entradaMusicasMissa.getValue() instanceof Musica) {
                musicasEmail.append(entradaMusicasMissa.getKey().toString());
                musicasEmail.append(":\n\t");
                musicasEmail.append(((Musica) entradaMusicasMissa.getValue()).getTitulo());
                musicasEmail.append("\n");
            } else {
                musicasEmail.append("Especiais:\n");
                for (Musica musicaMissa : ((Iterable<? extends Musica>) entradaMusicasMissa.getValue())) {
                    musicasEmail.append("\t");
                    musicasEmail.append(musicaMissa.getTitulo());
                    musicasEmail.append("\n");
                }
            }
        }

        this.areaDescricaoEmail.setText(textoEmail.replaceAll("<músicas>", musicasEmail.toString())
                .replaceAll("<saudação diária>", mensagemSaudacao())
                .replaceAll("<data>", DataUtil.formatarData(this.missa.getDataAcontecimento())));
    }

    private String mensagemSaudacao() {
        Date dataAtual = new Date();
        Calendar calendario = new GregorianCalendar();
        String saudacao;

        calendario.setTime(dataAtual);

        int horaDoDia = calendario.get(Calendar.HOUR_OF_DAY);

        if (horaDoDia >= 0 && horaDoDia < 12) {
            saudacao = "Bom dia";
        } else if (horaDoDia < 18) {
            saudacao = "Boa tarde";
        } else {
            saudacao = "Boa noite";
        }

        return saudacao;
    }

    private void initComponents() {
        BotoesImagemUtil.definirComportamento(this.imgInicio);
        BotoesImagemUtil.definirComportamento(this.imgVoltar);
    }

    /**
     * Inicializa as ações do controlador
     *
     * @param url
     * @param rb
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        initComponents();
    }

    @FXML
    private void onMouseClickedFromContentMontarMissaFinalizacao(MouseEvent event) {
        this.contentMontarMissaFinalizacao.requestFocus();
    }

    @FXML
    private void onMouseClickedFromImgInicio(MouseEvent event) {
        Dialogs.DialogResponse resposta = Dialogs.showConfirmDialog(HomeController.getInstancia().getStage(),
                "A montagem da Missa será perdida. Deseja realmente ir para o Início?",
                "Ir para tela de Início", "Confirmação");

        if (resposta.equals(Dialogs.DialogResponse.YES)) {
            FXMLDocumentController.getInstancia().iniciarPaginaInicial();
        }
    }

    @FXML
    private void onActionFromBtnOk(ActionEvent event) {
        this.missa.setDescricaoEmail(this.areaDescricaoEmail.getText());

        MissaJpaController.getInstancia().create(this.missa);

        Dialogs.showInformationDialog(HomeController.getInstancia().getStage(),
                "Os dados da Missa foram salvos com sucesso!", "Sucesso!", "Informação");

        this.controladorPesquisa.atualizar();

        FXMLDocumentController.getInstancia().iniciarPaginaInicial();
    }

    @FXML
    private void onMouseClickedFromImgVoltar(MouseEvent event) {
        //Carrega a página anterior
        AnchorPane pai = ((AnchorPane) this.contentMontarMissaFinalizacao.getParent());
        EfeitosUtil.rodarEfeitoCarregamentoFadeOut(this.contentMontarMissaFinalizacao, pai.getChildren());
    }
}
